package com.tssf.car_manage.controller;

import com.github.pagehelper.PageInfo;
import com.tssf.car_manage.entity.RepairRecord;
import com.tssf.car_manage.entity.Vehicle;
import com.tssf.car_manage.service.RepairRecordService;
import com.tssf.car_manage.service.VehicleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller //用于标识一个类是Spring MVC的控制器（Controller），负责处理HTTP请求并返回响应（视图）
@RequestMapping("/repair") //映射HTTP请求(URL路径、方法、参数等)到Controller类或方法
                              //所有方法的基础路径为/repair
public class RepairRecordController {

    @Autowired  //依赖注入
    RepairRecordService repairRecordService;

    @Autowired
    VehicleService vehicleService;

    @GetMapping("/list")    //处理路径为 /list 的GET请求
    public String list(
            @RequestParam(value = "page", defaultValue = "1") int page,
            @RequestParam(value = "key", required = false) String key,
            Model model) {

        int pageSize = 10; // 每页10条记录
        PageInfo<RepairRecord> pageInfo;

        if (key != null && !key.isEmpty()) {
            pageInfo = repairRecordService.search(key, page, pageSize);
            model.addAttribute("key", key);
        } else {
            pageInfo = repairRecordService.listWithLicensePlate(page, pageSize);
        }

        model.addAttribute("repairRecords", pageInfo.getList());
        model.addAttribute("currentPage", pageInfo.getPageNum());
        model.addAttribute("totalPages", pageInfo.getPages());

        // 返回视图路径：/repair/list.html
        return "repair/list";

    }

    @GetMapping("/search")
    public String search(
            @RequestParam("key") String key,
            @RequestParam(value = "page", defaultValue = "1") int page,
            Model model) {
        //@RequestParam("key")，从 HTTP请求的查询参数或表单数据中提取值，并绑定到方法的参数上

        int pageSize = 10;
        PageInfo<RepairRecord> pageInfo = repairRecordService.search(key, page, pageSize);

        model.addAttribute("repairRecords", pageInfo.getList());
        model.addAttribute("currentPage", pageInfo.getPageNum());
        model.addAttribute("totalPages", pageInfo.getPages());
        model.addAttribute("key",key);

        //返回与列表相同的视图
        return "repair/list";

    }

    @GetMapping("/delete/{id}")
    public String delete(@PathVariable("id") int repair_id, Model model) {
        //@PathVariable("id")，从 URL路径模板中提取变量值，并将其绑定到方法的参数上

        // 从URL路径中获取id参数
        int result = repairRecordService.deleteById(repair_id);
        // 根据删除结果设置成功或失败消息
        if(result > 0) {
            model.addAttribute("success", "删除成功");
        } else {
            model.addAttribute("error", "删除失败");
        }
        // 重定向到列表页
        return "redirect:/repair/list";
    }

    @GetMapping("/add")
    public String showAddForm(Model model) {
        // 获取所有车辆信息（用于选择车牌号）
        List<Vehicle> vehicles = vehicleService.lists();
        // 创建新的维修记录对象
        RepairRecord repairRecord = new RepairRecord();
        // 设置默认状态为"进行中"
        repairRecord.setStatus("进行中");
        // 将对象添加到模型
        model.addAttribute("repairRecord", repairRecord);
        model.addAttribute("vehicles", vehicles);
        // 返回添加表单视图
        return "repair/add";
    }

    //处理添加提交
    @PostMapping("/add")    //处理HTTP POST请求，用于“接收”客户端提交的表单数据
    public String add(RepairRecord repairRecord, Model model) {
        // 接收表单提交的RepairRecord对象
            // 这里的int返回值通常表示 受影响的行数
            // 成功时：返回大于0的值（如1表示更新了1条记录）。
            // 失败时：返回0（记录不存在或更新失败）或抛出异常。
        int result = repairRecordService.insert(repairRecord);
        if(result > 0) {
            // 添加成功，重定向到列表页
            return "redirect:/repair/list";
        } else {
            // 添加失败，返回添加页并显示错误
            model.addAttribute("error", "添加失败");
            return "repair/add";
        }
    }

    @GetMapping("/edit/{id}")
    public String showEditForm(@PathVariable("id") int repair_id, Model model) {
        // 根据维修单号(repair_id)获取维修记录
        RepairRecord repairRecord = repairRecordService.getById(repair_id);
        if (repairRecord == null) {
            // 记录不存在，重定向到列表页
            return "redirect:/repair/list";
        }
        // 将记录添加到模型
        model.addAttribute("repairRecord", repairRecord);
        // 返回编辑表单视图
        return "repair/edit";
    }

    //处理编辑提交
    @PostMapping("/edit")
    public String edit(RepairRecord repairRecord, Model model) {
        // 接收表单提交的修改后的RepairRecord对象
        int result = repairRecordService.update(repairRecord);
        if (result > 0) {
            // 更新成功，重定向到列表页
            return "redirect:/repair/list";
        } else {
            // 更新失败，返回编辑页并显示错误
            model.addAttribute("error", "更新失败");
            return "repair/edit";
        }
    }

    @PostMapping("/update-status")
    @ResponseBody   // 直接返回数据，不返回视图
    public ResponseEntity<String> updateStatus(
            @RequestParam("id") int repairId, // 从请求参数获取id
            @RequestParam("status") String status   // 从请求参数获取status
    ) {
        // 根据ID获取记录
        RepairRecord record = repairRecordService.getById(repairId);
        if (record == null) {
            // 记录不存在，返回404
            return ResponseEntity.notFound().build();
        }
        // 更新状态
            //record是从数据库查询出的RepairRecord实体对象，包含所有字段
            //setStatus()是实体类的标准Setter方法，用于修改对象的status属性
        record.setStatus(status);
        int result = repairRecordService.update(record);
        // 返回操作结果
        if (result > 0) {
            //成功响应：ResponseEntity.ok()
            return ResponseEntity.ok("状态更新成功");
        } else {
            //失败响应：ResponseEntity.status()
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("状态更新失败");
        }
    }

}
